package org.cyz.tools.core.assembly.tableview;

import javafx.scene.control.*;
import javafx.scene.control.cell.TextFieldTreeCell;
import javafx.stage.Stage;
import javafx.util.converter.DefaultStringConverter;
import org.cyz.tools.common.util.TreeUtil;
import org.cyz.tools.common.util.*;
import org.cyz.tools.controller.BodyController;
import org.cyz.tools.controller.MainController;
import org.cyz.tools.core.ContextManager;
import org.cyz.tools.core.assembly.Notify;
import org.cyz.tools.core.assembly.dialog.DialogBuilder;
import org.cyz.tools.core.assembly.log.Log;
import org.cyz.tools.core.manager.WindowManager;


/**
 * @author abccy
 * @title: MenuTreeCell
 * @projectName RedisGUI
 * @description: TODO
 * @date 2020-9-622:23
 */
public class MenuTreeCell extends TextFieldTreeCell<String> {


    private Stage stage;
    private TreeView treeView;
    private TreeItem<String> rootItem;

    private ContextMenu menu = new ContextMenu();
    private  MainController mainController =null;
    private BodyController bodyController = null;


    /**
     * 图标获取工具
     */
    private ImageUtil ImageUtil = new ImageUtil();
    /**
     * jedis工具
     **/
    private RedisUtil redisUtil = new RedisUtil();


    /**
     * 根据类型实例化菜单列表
     *  0: 服务地址菜单
     *  1: 数据库上的右键菜单
     * @param type
     */
    public MenuTreeCell(int type) {
        super(new DefaultStringConverter());
        mainController = (MainController) ContextManager.ctrManager.getController(MainController.class.getSimpleName());
        bodyController = (BodyController) ContextManager.ctrManager.getController(BodyController.class.getSimpleName());

        if (null != mainController) {
            treeView = mainController.treeView;
            rootItem = mainController.rootItem;
        }
        switch (type) {
            case 0:
                mainMenu();
                break;
            case 1:
                subMenu();
                break;
        }
    }

    /**
     * 主菜单
     */
    private void mainMenu(){

        MenuItem refresh = new MenuItem("刷新", org.cyz.tools.common.util.ImageUtil.getIcon("refresh"));
        SeparatorMenuItem separator = new SeparatorMenuItem();
        MenuItem closeConnect = new MenuItem("关闭连接", org.cyz.tools.common.util.ImageUtil.getIcon("connection"));

        menu.getItems().add(separator);
        menu.getItems().add(closeConnect);
        menu.getItems().add(refresh);
        menu.getItems().add(closeConnect);



        refresh.setOnAction(actionEvent -> {

        });
        closeConnect.setOnAction(actionEvent -> {
            TreeItem tItem = (TreeItem) treeView.getSelectionModel().getSelectedItem();
            if(null==tItem){
                return;
            }
            String url = tItem.getValue().toString();
            if (!(null != url && IpUtil.isIP(url.split(":")[0]) && StringUtil.isNumeric(url.split(":")[1]))) {
                Notify.toast("请选择服务地址关闭连接!");
                return;
            }
            RedisUtil.isOpen = false;
            if (redisUtil.closeClient() && TreeUtil.closeTree(treeView)) {
                Log.info(MenuTreeCell.class.getSimpleName(),"关闭完成!");
                bodyController.clearOldValue();
                //移除所有子节点
                boolean flag = ((TreeItem<?>) treeView.getSelectionModel().getSelectedItem()).getChildren().removeAll(((TreeItem<?>) treeView.getSelectionModel().getSelectedItem()).getChildren());
                if (flag) {
                    //删除成功后将服务地址打开的标记移除掉
                    CommonUtil.IP_LIST.remove(((TreeItem<?>) treeView.getSelectionModel().getSelectedItem()).getValue());
                }
            }

        });
    }


    /**
     * 数据库层的菜单
     */
    private void subMenu(){
        publicMenu();
    }


    /**
     * 公共的菜单模块
     */
    private void publicMenu(){
        MenuItem addMenuItem = new MenuItem("新增", org.cyz.tools.common.util.ImageUtil.getIcon("add"));
        MenuItem editMenuItem = new MenuItem("修改", org.cyz.tools.common.util.ImageUtil.getIcon("edit"));
        MenuItem delMenuItem = new MenuItem("删除", org.cyz.tools.common.util.ImageUtil.getIcon("delete"));
        SeparatorMenuItem separator = new SeparatorMenuItem();
        menu.getItems().add(addMenuItem);
        menu.getItems().add(editMenuItem);
        menu.getItems().add(delMenuItem);
        menu.getItems().add(separator);
        addMenuItem.setOnAction(actionEvent -> {
            //新增操作
//            String url = Alert.inputIP();
//            new DialogBuilder(treeView).setTitle("提示").setContent("").setPromptText("格式:192.168.0.1:6379").setMessage("输入服务端地址(格式: 192.168.0.1:6379&)").setTextFieldText(new DialogBuilder.OnInputListener() {
//                @Override
//                public void onGetText(String url) {
//                    if (null == url) {
//                        Toast.toast("新建立连接地址不能为空!");
//                        return;
//                    } else {
//                        //验证是否是标准ip
//                        if (!IpUtil.isIP(url.split(":")[0])) {
//                            Toast.toast("输入的" + url.split(":")[0] + "不是有效的ip地址!");
//                            return;
//                        }
//                        //验证端口
//                        if (!StringUtil.isNumeric(url.split(":")[1])) {
//                            Toast.toast("端口必须为正整数!");
//                            return;
//                        }
//                        //入库
//                        int result = TreeUtil.addTreeItem(url);
//                        ;
//                        if (result > 0) {
//                            rootItem.getChildren().add(new TreeItem<>(url, ImageUtil.getIcon("connect")));
//                        }
//                    }
//                }
//            }).setPositiveBtn("确定").setNegativeBtn("取消").create();
            if(null==stage){
                stage=  new WindowManager("fxml/NewConnection.fxml").setTitle("连接设置").isTop(false).setSize(613,700).builder();
            }else{
                if(!stage.isShowing()){
                    stage.show();
                }
            }
        });
        editMenuItem.setOnAction(actionEvent -> {
            //编辑
            startEdit();
            System.out.println("编辑");
        });
        delMenuItem.setOnAction(actionEvent -> {
            //删除操作
            if (null == getText() || getText().trim().length() <= 0) {
                Log.info(MenuTreeCell.class.getSimpleName(),"没有选中栏目...");
                Notify.toast("没有选中的栏目!");
                return;
            }
            //验证ip
            if (IpUtil.isIP(getText().split(":")[0])) {
                new DialogBuilder(treeView).setTitle("提示").setMessage("确认删除 " + getText() + " 吗?此操作不可逆!").setTextFieldText(result -> {
                    if(null!=result){
                        //删除
                        if (TreeUtil.delTreeItemData(getText()) && TreeUtil.delTreeItem(treeView)) {
                            Notify.toast("删除成功！");
                        }
                    }
                }).setPositiveBtn("确定").setNegativeBtn("取消").create();

//                //删除连接
//                if (1 == Alert.tip("确认删除 " + getText() + " 吗?此操作不可逆!", 3)) {
//                    //删除
//                    if (TreeUtil.delTreeItemData(getText()) && TreeUtil.delTreeItem(treeView))
//                        Toast.toast("删除成功！");
//                } else {
//                    logger.info("放弃了删除 " + getText());
//                }
            } else {
                //二级栏目，调用redis实现删除,先判断是不是db的索引
                if (null != getText() && getText().contains("(")) {
                    String val = getText().substring(0, getText().indexOf("("));
                    if (StringUtil.containDBIndex(val)) {
                        //是个二级DB栏目不执行删除动作给出提示
                        Notify.toast("不能删除DB库!");
                        return;
                    }
                } else {
                    //这里是redis的key了
                    if (redisUtil.del(getText().trim())) {
                        //删除列表上数据
                        if (TreeUtil.delTreeItem(treeView)) {
                            bodyController.clearOldValue();
                            Notify.toast("删除完成!");
                            //更新key的数量
                            TreeUtil.updateKeyCount(treeView);
                        } else {
                            Notify.toast("删除失败！");
                        }
                    }
                }
            }
        });
    }

    @Override
    public void updateItem(String item, boolean empty) {
        super.updateItem(item, empty);
        if (!isEditing()) {
            setContextMenu(menu);
        }
    }


}
